<?php

use Illuminate\Support\Facades\Route;

if (!function_exists('ensureArray')) {
    /**
     * Json转换数组
     * @param mixed $value 给定的值
     * @return array 转换后的数组
     */
    function ensureArray(mixed $value): array
    {
        if (is_string($value)) {
            $decoded = json_decode($value, true, 512, JSON_THROW_ON_ERROR);
            if (is_array($decoded)) {
                return $decoded;
            }
        }
        return (array) $value;
    }
}

if (!function_exists('build_tree')) {
    /**
     * 数组转换为树形结构
     * @param array $array 原始数据包
     * * @param string $pid 父节点 ID 的键名，默认为 'pid'
     * * @param string $childKey 子节点数组的键名，默认为 'children'
     * * @return array 格式化的树形结构
    */
    function build_tree(array $array, string $pid = 'pid', string $childKey = 'children'): array
    {
        // 如果输入数组为空，直接返回空数组
        if (empty($array)) {
            return [];
        }

        // 创建一个ID到节点的引用映射
        $map = [];
        foreach ($array as &$node) {
            $map[$node['id']] = &$node;
            // 初始化children数组为空数组（不需要再次引用，因为$item已经是引用）
            $map[$node['id']][$childKey] = [];
        }
        // 构建树形结构
        $rootNodes = [];
        foreach ($array as $item) {
            // 获取父节点的引用（如果存在）
            $parentId = $item[$pid] ?? null; // 使用null合并运算符处理未定义的$pid键
            if (isset($map[$parentId])) {
                $parent = &$map[$parentId];
                // 将当前节点添加到父节点的children数组中（保持引用）
                $parent[$childKey][] = &$map[$item['id']]; // 这里需要引用，以便在父节点的children数组中更新子节点
            } else {
                // 如果没有父节点，则当前节点是根节点
                $rootNodes[] = &$map[$item['id']]; // 这里也需要引用，以便后续可能对根节点进行的修改能够反映到树中
            }
        }
        return $rootNodes;
    }
}

if(!function_exists('loadRoutesFromDirectory')) {
    /**
     * 加载指定目录下的所有路由文件
     *
     * @param string $directory 路由文件所在的目录路径
     * @param array|string $middleware 路由中间件
     * @param string $prefix URL前缀
     */
    function loadRoutesFromDirectory(string $directory, array|string $middleware = 'api', string $prefix = 'admin'): void
    {
        $files = glob($directory . '/*.php');

        foreach ($files as $file) {
            Route::middleware($middleware)->prefix($prefix)->group(function () use ($file) {
                require $file;
            });
        }
    }
}

if(!function_exists('buildMenuTree')) {
    // 构建菜单树
    function buildMenuTree($items, $parentId = 0) {
        $tree = [];
        foreach ($items as $item) {
            if ($item['pid'] == $parentId) {
                if ($item['type'] == 1) { // 菜单项
                    $node = [
                        'name' => $item['name'],
                        'path' => $item['path'],
                        'component' => $item['component'],
                        'meta' => [
                            'icon' => $item['icon'] ?: '',
                            'order' => $item['sort'],
                            'title' => $item['name'],
                            'keepAlive' => $item['is_cache'] ? true : false,
                            'hideInMenu' => $item['is_show'] ? false : true,
                        ]
                    ];

                    // 如果有子菜单项，递归构建
                    $children = buildMenuTree($items, $item['id']);
                    if (!empty($children)) {
                        $node['children'] = $children;
                    }

                    $tree[] = $node;
                }
            }
        }
        return $tree;
    }
}
